from jinja2 import contextfunction

from application.utils.admin import AdminView,expose,admin
# 自定义一个导航页面
# class UserAdmin(AdminView):
#     """用户模型视图类"""
#     @expose("/")
#     def index(self,*args,**kwargs):
#         self.data['title'] = "admin站点用户相关的内容"
#         return self.render_template(template="admin/user/index.html",**self.data)
#
# admin.add_view(UserAdmin(name='用户',url="user"))

# 基于模型自动生成导航页面
from .models import User,db
from flask_admin.contrib.sqla import ModelView

class UserAdminModel(ModelView):
    # 列表页显示字段列表
    column_list = ["id","name","nickname","sex"]

    # 列表页显示排除字段列表
    # column_exclude_list = ["is_delete"]

    # 列表页可以直接编辑的字段列表
    column_editable_list = ["nickname","name"]

    # 是否允许查看详情
    can_view_details = True

    # 列表页显示直接可以搜索数据的字典
    column_searchable_list = ['nickname','name', 'email']

    # 过滤器
    column_filters = ['sex']

    # 单页显示数据量
    page_size = 10

    # 列表显示钩子
    def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None):
        return super().get_list(page, sort_field, sort_desc, search, filters, page_size=None)

    def _get_list_value(self, context, model, name, column_formatters,
                        column_type_formatters):

        # 判断对应的字段，修改相应字段的显示
        if name=="sex":
            model.sex = "男" if model.sex else "女"

        return super()._get_list_value(context, model, name, column_formatters,
                        column_type_formatters)

    # 修改模型钩子
    def on_model_change(self,form, model, is_created):
        print(form)   # 客户端提交的表单数据
        print(model)  # 本次操作的数据数据
        print(is_created) # 本次操作是否属于添加操作，False表示修改

        return super().on_model_change(form, model, is_created)

    # 删除模型钩子
    def on_model_delete(self, model):
        # 删除日志的记录
        # 其他数据表是否存在外在关联
        return super().on_model_delete(model)

# 注册模型视图生成导航
# admin.add_view(UserAdminModel(User,db.session,name="用户"))

# 把当前页面添加到顶级导航下，category来设置，如果导航不存在，则自动创建
admin.add_view(UserAdminModel(User,db.session,name="用户信息", category="用户管理"))

# 添加子导航还有种方式： 添加超链接作为导航
from flask_admin.menu import MenuLink
admin.add_link(MenuLink(name='老男孩', url='http://www.oldboyedu.com', category='用户管理')) # 把超链接作为子导航加载到顶级导航中